package com.hua.designpattern.behavioral.chainofresponsibility;

/**
 * 
 * @author joshua
 *
 *         <pre>
 *  责任链模式（Chain of Responsibility Pattern）为请求创建了一个接收者对象的链。这种模式给予请求的类型，对请求的发送者和接收者进行解耦。
 *  在这种模式中，通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求，那么它会把相同的请求传给下一个接收者，依此类推。
 *  
 *  优点：  1、降低耦合度。它将请求的发送者和接收者解耦。
 *       2、简化了对象。使得对象不需要知道链的结构。 
 *       3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序，允许动态地新增或者删除责任。 
 *       4、增加新的请求处理类很方便。
 *  缺点：   1、不能保证请求一定被接收。 
 *       2、系统性能将受到一定影响，而且在进行代码调试时不太方便，可能会造成循环调用。 
 *       3、可能不容易观察运行时的特征，有碍于除错。
 *       
 *     REF:
 *        Struts2 的拦截器
 *        jsp servlet 的 Filter
 *        java中的Exception处理
 * 
 *         </pre>
 *
 *
 */

public class TestChainOfResponsibility {

	private static AbstractLogger getLoggerChain() {
		AbstractLogger fatalLogger = new FatalLogger(AbstractLogger.FATAL);
		AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
		AbstractLogger warnLogger = new WarnLogger(AbstractLogger.WARN);
		AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
		AbstractLogger allLogger = new FatalLogger(AbstractLogger.ALL);
		fatalLogger.setNextLogger(errorLogger);
		errorLogger.setNextLogger(warnLogger);
		warnLogger.setNextLogger(infoLogger);
		infoLogger.setNextLogger(allLogger);
		return fatalLogger;
	}

	public static void main(String[] args) {
		AbstractLogger rootLogger = getLoggerChain();
		rootLogger.logMessage(10, "should fatal logger");
		rootLogger.logMessage(4, "should fatal logger");
		rootLogger.logMessage(3, "should error logger");
		rootLogger.logMessage(2, "should warn logger");
		rootLogger.logMessage(1, "should info logger");
		rootLogger.logMessage(0, "should all logger");
		rootLogger.logMessage(-1, "can not log");
	}
}
